<?php

class HorarioedController extends Zend_Controller_Action {

    public function init() {
        X\Permiso::paraController();
        $this->em = Zend_Registry::getInstance()->entitymanager;
    }

    public function indexAction() {
        X\Permiso::paraAction('Crear.Horario');
        $session = new Zend_Session_Namespace('Usuario');

        $facultades = $this->em->createQueryBuilder()
                        ->select('f.idFacultad')
                        ->addselect('f.nombre')
                        ->from('Default_Model_Facultad', 'f')
                        ->orderBy('f.nombre', 'asc')
                        ->getQuery()
                        ->execute();

        $this->view->facultades = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($facultades),
                    "rows" => $facultades
                ));

        if ($session->permisos_generales['Crear.Horario']['value'] == 'all') {
            $carreras = $this->em->createQueryBuilder()
                            ->select('c.idCarrera')
                            ->addselect('c.nombre')
                            ->addselect('c.duracionHora')
                            ->from('Default_Model_Carrera', 'c')
                            ->orderBy('c.nombre', 'asc')
                            ->getQuery()
                            ->execute();
        } else if ($session->permisos_generales['Crear.Horario']['value'] == 'normal') {

            $array = '(';
            $c = 0;
// X\Msg::Success('El horario ha2');return;
            foreach ($session->permisos_generales['Crear.Horario']['departamento'] as $p) {
                if ($c) {
                    $array.=',' . $p;
                    $c++;
                } else {
                    $c++;
                    $array.=$p;
                }
            }
            $array.=')';

            $carreras = $this->em->createQueryBuilder()
                            ->select('c.idCarrera')
                            ->addselect('c.nombre')
                            ->addselect('c.duracionHora')
                            ->from('Default_Model_Carrera', 'c')
                            ->where('c.departamento IN' . $array . '')
                            ->orderBy('c.nombre', 'asc')
                            ->getQuery()
                            ->execute();
        }

        $this->view->carreras = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($carreras),
                    "rows" => $carreras
                ));

        $aulas = $this->em->createQueryBuilder()
                        ->select('a.idAula')
                        ->addselect('a.nombre')
                        ->from('Default_Model_Aula', 'a')
                        ->orderBy('a.nombre', 'asc')
                        ->getQuery()
                        ->execute();

        $this->view->aulas = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($aulas),
                    "rows" => $aulas
                ));
        $qb = $this->em->createQueryBuilder();
        $profesores = $qb->select('p.idProfesor')
                        ->addselect('u.nombre')
                        ->addselect('u.apellido')
                        ->from('Default_Model_Profesor', 'p')
                        ->join('p.usuario', 'u')
                        ->orderBy('u.apellido', 'asc')
                        ->getQuery()
                        ->execute();

        $this->view->profesores = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($profesores),
                    "rows" => $profesores
                ));
        $categorias = $this->em->createQueryBuilder()
                        ->select('c.idCategoria')
                        ->addselect('c.nombre')
                        ->from('Default_Model_Categoria', 'c')
                        ->orderBy('c.nombre', 'asc')
                        ->getQuery()
                        ->execute();

        $this->view->categorias = Zend_Json::encode(Array(
                    "success" => true,
                    "total" => count($categorias),
                    "rows" => $categorias
                ));
    }

    public function ajaxMateriasAction() {

// Para traer las materias posibles segun la carrera y semestre
// y verificar que no exista un horario en el mismo periodo

        $anho = $this->_request->getPost('anho');
        $semestre = $this->_request->getPost('semestre');
        $semanho = $this->_request->getPost('semestreanho');
        $seccion = $this->_request->getPost('seccion');
        $carrera = $this->_request->getPost('carrera');

        $where_semestre = $semestre == 'libre' ? "cm.semestre=0" : "cm.semestre='" . $semestre . "'";
        $where_tipo = $semestre == 'libre' ? "m.tipo='T' OR m.tipo='C'" : '1=1';
        //$date = date('Y');
        if ($semanho == '1') {
            $fin = '30/06/' . $anho;
        } else {
            $fin = '31/12/' . $anho;
        }
        $cantidad = $this->em->createQueryBuilder()
                        ->select('count(c.idCurso)')
                        ->from('Default_Model_Curso', 'c')
                        ->join('c.carreraMateria', 'cm')
                        ->join('cm.carrera', 'ca')
                        ->where("c.anho='" . $anho . "'")
                        ->andWhere("c.validoHasta='" . $fin . "'")
                        ->andWhere($where_semestre)
                        ->andWhere("c.semestreAnho='" . $semanho . "'")
                        ->andWhere("c.seccion='" . $seccion . "'")
                        ->andWhere("c.tipo is NULL")
                        ->andWhere("ca.idCarrera='" . $carrera . "'")
                        ->getQuery()
                        ->getSingleScalarResult();

        if ($cantidad > 0) {

            echo Zend_Json::encode(Array(
                "success" => true,
                "total" => $cantidad
            ));
        } else {
            echo Zend_Json::encode(Array(
                "success" => true,
                "total" => $cantidad
            ));
        }
    }

    public function ajaxCursosAction() {
        $anho = $this->_request->getPost('anho');
        $semestre = $this->_request->getPost('semestre');
        $semanho = $this->_request->getPost('semestreanho');
        $seccion = $this->_request->getPost('seccion');
        $carrera = $this->_request->getPost('carrera');

        $where_semestre = $semestre == 'libre' ? "cm.semestre=0" : "cm.semestre='" . $semestre . "'";
        $where_tipo = $semestre == 'libre' ? "m.tipo='T' OR m.tipo='C'" : '1=1';

       if ($semanho == '1') {
            $fin = '30/06/' . $anho;
        } else {
            $fin = '31/12/' . $anho;
        }

        $cursos = $this->em->createQueryBuilder()
                        ->select('c.idCurso')
                        ->addselect('cm.idCarreraMateria')
                        ->addselect('a.idAula')
                        ->addselect('de.dia')
                        ->addselect('de.horaInicio')
                        ->addselect('de.horaFin')
                        ->addselect('de.duracionHoras')
                        ->addselect('m.tipo')
                        ->from('Default_Model_Curso', 'c')
                        ->join('c.carreraMateria', 'cm')
                        ->join('cm.materia', 'm')
                        ->join('c.detalles', 'de')
                        ->leftjoin('de.aula', 'a')
                        ->join('cm.carrera', 'ca')
                        ->where("c.anho='" . $anho . "'")
                        ->andWhere("c.validoHasta='" . $fin . "'")
                        ->andWhere($where_semestre)
                        ->andWhere("c.semestreAnho='" . $semanho . "'")
                        ->andWhere("c.seccion='" . $seccion . "'")
                        ->andWhere("c.tipo is NULL")
                        ->andWhere("ca.idCarrera='" . $carrera . "'")
                        ->orderBy('cm.idCarreraMateria')
                        ->getQuery()
                        ->execute();

        foreach ($cursos as &$curso) {
            $cursoinicio = $curso['horaInicio']->format('H:i');
            $cursofin = $curso['horaFin']->format('H:i');
            $curso['horaInicio'] = $cursoinicio;
            $curso['horaFin'] = $cursofin;
        }
        echo Zend_Json::encode(Array(
            "success" => true,
            "total" => count($cursos),
            "rows" => $cursos
        ));
    }

    public function ajaxResponsablesAction() {
        $anho = $this->_request->getPost('anho');
        $semestre = $this->_request->getPost('semestre');
        $semanho = $this->_request->getPost('semestreanho');
        $seccion = $this->_request->getPost('seccion');
        $carrera = $this->_request->getPost('carrera');

        $where_semestre = $semestre == 'libre' ? "cm.semestre=0" : "cm.semestre='" . $semestre . "'";
        $where_tipo = $semestre == 'libre' ? "m.tipo='T' OR m.tipo='C'" : '1=1';
         if ($semanho == '1') {
            $fin = '30/06/' . $anho;
        } else {
            $fin = '31/12/' . $anho;
        }
        $responsables = $this->em->createQueryBuilder()
                        ->select('c.idCurso')
                        ->addselect('cm.idCarreraMateria')
//                        ->addselect('re.idResponsable')
                        ->addselect('p.idProfesor')
                        ->addselect('ct.idCategoria')
                        ->addselect('re.marca')
                        ->from('Default_Model_Curso', 'c')
                        ->join('c.carreraMateria', 'cm')
                        ->join('c.responsables', 're')
                        ->join('re.profesor', 'p')
                        ->join('re.categoria', 'ct')
                        ->join('cm.carrera', 'ca')
                        ->where("c.anho='" . $anho . "'")
                        ->andWhere($where_semestre)
                        ->andWhere("c.validoHasta='" . $fin . "'")
                        ->andWhere("c.semestreAnho='" . $semanho . "'")
                        ->andWhere("c.seccion='" . $seccion . "'")
                        ->andWhere("c.tipo is NULL")
                        ->andWhere("ca.idCarrera='" . $carrera . "'")
                        ->orderBy('cm.idCarreraMateria')
                        ->getQuery()
                        ->execute();
// var_dump($responsables);return;
        echo Zend_Json::encode(Array(
            "success" => true,
            "total" => count($responsables),
            "rows" => ($responsables)
        ));
    }

    public function ajaxMateriascargarAction() {
        $anho = $this->_request->getPost('anho');
        $semestre = $this->_request->getPost('semestre');
        $semanho = $this->_request->getPost('semestreanho');
        $seccion = $this->_request->getPost('seccion');
        $carrera = $this->_request->getPost('carrera');

        $where_semestre = $semestre == 'libre' ? "cm.semestre=0" : "cm.semestre='" . $semestre . "'";
        $where_tipo = $semestre == 'libre' ? "m.tipo='T' OR m.tipo='C'" : '1=1';
        $materias = $this->em->createQueryBuilder()
                        ->select('cm.idCarreraMateria')
                        ->addSelect('m.nombre')
                        ->addSelect('m.horasCatedra')
                        ->addSelect('m.tipo')
                        ->from('Default_Model_CarreraMateria', 'cm')
                        ->join('cm.materia', 'm')
                        ->where($where_semestre)
                        ->andWhere($where_tipo)
                        ->andWhere("cm.carrera='" . $carrera . "'")
                        ->orderBy('m.nombre', 'asc')
                        ->getQuery()
                        ->execute();


        if (count($materias) == 0) {
            X\Msg::Failure('No existen materias para el semestre seleccionado.<br>Por favor seleccione un semestre diferente.');
        } else {
            echo Zend_Json::encode(Array(
                "success" => true,
                "total" => count($materias),
                "rows" => $materias
            ));
        }
    }

    public function ajaxCargarAction() {
        $anho = $this->_request->getPost('anho');
        $semestre = $this->_request->getPost('semestre');
        $semanho = $this->_request->getPost('semestreanho');
        $seccion = $this->_request->getPost('seccion');
        $carrera = $this->_request->getPost('carrera');
        $tipo = $this->_request->getPost('tipo');
        $fecha2 = $this->_request->getPost('fecha');
        $detalles = $this->_request->getPost('detalles');
        $responsables = $this->_request->getPost('responsables');
        $detalleR = $this->_request->getPost('detalleR');
        $detalles = Zend_Json::decode($detalles);
        $detalleR = Zend_Json::decode($detalleR);
        $responsables = Zend_Json::decode($responsables);
        
        $fecha = new DateTime($fecha2);
        $where_semestre = $semestre == 'libre' ? "cm.semestre=0" : "cm.semestre='" . $semestre . "'";
        $where_tipo = $semestre == 'libre' ? "m.tipo='T' OR m.tipo='C'" : '1=1';
        if ($semanho == '1') {
            $fin = '30/06/' . $anho;
        } else {
            $fin = '31/12/' . $anho;
        }
         
        $cursos = $this->em->createQueryBuilder()
                        ->select('c.idCurso')
                        ->addselect('c.validoDesde')
                        ->from('Default_Model_Curso', 'c')
                        ->join('c.carreraMateria', 'cm')
                        ->join('cm.carrera', 'ca')
                        ->where("c.anho='" . $anho . "'")
                        ->andWhere("c.validoHasta='" . $fin . "'")
                        ->andWhere($where_semestre)
                        ->andWhere("c.semestreAnho='" . $semanho . "'")
                        ->andWhere("c.seccion='" . $seccion . "'")
                        ->andWhere("c.tipo is NULL")
                        ->andWhere("ca.idCarrera='" . $carrera . "'")
                        ->orderBy('cm.idCarreraMateria')
                        ->getQuery()
                        ->execute();
        
        $desde=$cursos[0]['validoDesde']->format("d/m/Y");
        // var_dump($desde);return;
        
        if ($tipo == 2) {
            foreach ($cursos as $curso) {
                $pd = $this->em->find('Default_Model_Curso', $curso['idCurso']);
                $this->em->remove($pd);
            }
        } else if ($tipo == 1) {
           
            $hastaFin = new DateTime($fecha2);
            $hastaFin->sub(new DateInterval("P1D"));
            //X\Msg::Success($hastaFin->format('d/m/Y').' '.$fecha2->format('d/m/Y'));return;
            foreach ($cursos as $curso) {
                $pd = $this->em->find('Default_Model_Curso', $curso['idCurso']);
                //$fecha=date("Y-m-d");
                $pd->setValidoHasta($hastaFin->format('d/m/Y'));
            }
        }
       // X\Msg::Success('El horario ha sido editadoa exitosamente.');return;
        $this->em->flush();
       // X\Msg::Success('El horario ha sido editadoa exitosamente.');return;
        if ($semestre == 'libre') {
            $semestre = 0;
        }
        
       
//X\Msg::Success(' '.count($detalles).' '.count($detalleR).' '.count($responsables));return;
//Determinar fecha de validez del curso segun semestre del año
        if ($semanho == 1) {
            $hasta = '30/06/' . $anho;
        } else {
            $hasta = '31/12/' . $anho;
        }
        if ($tipo == 1) {
            $validesde = $fecha;
            $desde = $validesde->format("d/m/Y");
        }

        function compare_materia($a, $b) {
            return strnatcmp($a['materia'], $b['materia']);
        }

// sort by materia
        usort($detalles, 'compare_materia');
        usort($responsables, 'compare_materia');

//id de carrera materia, inicialmente 0 (ninguna)
        $cm = -1;

        foreach ($detalles as $detalle) {
//Nueva materia, implica nuevo curso
            if ($cm != $detalle['materia']) {
//La primera vez no hay materia todavia

                if ($cm != -1) {
                    $this->em->persist($curso);
                }
                $carreraMateria = $this->em->find('Default_Model_CarreraMateria', $detalle['materia']);

                $cm = $detalle['materia'];
//crear curso
                $curso = new Default_Model_Curso();
                $curso->setCarreraMateria($carreraMateria);
                $curso->setAnho($anho);
                $curso->setSemestre($semestre);
                $curso->setSemestreAnho($semanho);
                $curso->setSeccion($seccion);
                $curso->setValidoDesde($desde);
                $curso->setValidoHasta($hasta);
            }

//Definir condicion de busqueda para aula
            if ($detalle['aula'])
                $whereAula = "d.aula='" . $detalle['aula'] . "'";
            else
                $whereAula = "d.aula IS NULL";

//Verificar que no exista el detalle
            //X\Msg::Success('Inicio:'.$detalle['inicio'].' fin:'.$detalle['fin']);
            //return;
            $qb = $this->em->createQueryBuilder();
            $check = $qb->select('d.idDetalle')
                            ->from('Default_Model_DetalleCurso', 'd')
                            ->where("d.dia='" . $detalle['dia'] . "'")
                            ->andWhere("d.horaInicio='" . $detalle['inicio'] . "'")
                            ->andWhere("d.horaFin='" . $detalle['fin'] . "'")
                            ->andWhere("d.duracionHoras='" . $detalle['horas'] . "'")
                            ->andWhere($whereAula)
                            ->getQuery()
                            ->execute();
            //  X\Msg::Success('hola');return;
            if ($check) {
                $detalleCurso = $this->em->find('Default_Model_DetalleCurso', $check[0]['idDetalle']);
                $curso->getDetalles()->add($detalleCurso);
            } else {
//Datos de detalle
                $detalleCurso = new Default_Model_DetalleCurso();
                if ($detalle['aula']) {
                    $aula = $this->em->find('Default_Model_Aula', $detalle['aula']);
                    $detalleCurso->setAula($aula);
                }
                $detalleCurso->setDia($detalle['dia']);
                $detalleCurso->setHoraInicio($detalle['inicio']);
                $detalleCurso->setHoraFin($detalle['fin']);
                $detalleCurso->setDuracionHoras($detalle['horas']);
                $this->em->persist($detalleCurso);
                $curso->getDetalles()->add($detalleCurso);
            }
        }
        $this->em->persist($curso);
        $this->em->flush();
        $date = date('Y');

        if ($semanho == '1') {
            $fin = '30/06/' . $anho;
        } else {
            $fin = '31/12/' . $anho;
        }
        //X\Msg::Success('Verificar cursos:'.$fin);return;
        // $responsables = Zend_Json::decode($responsables);


        foreach ($responsables as $resp) {

//Verificar que no exista el par (curso, profesor) antes de cargar
//Esto tanto en la BD como en los datos traidos de la pagina
//Tal vez haga falta un for de verificacion antes de este for de carga
//X\Msg::Failure('El horario ha sido cargado exitosamente. JOJOJOJOJO1'/*.$cursos->getCurso()*/);return;
            $cursos = $this->em->createQueryBuilder()
                            ->select('c.idCurso')
                            ->from('Default_Model_Curso', 'c')
                            ->join('c.carreraMateria', 'cm')
                            ->join('cm.materia', 'm')
                            ->where("cm.idCarreraMateria='" . $resp['materia'] . "'")
                            ->andWhere("c.validoHasta='" . $fin . "'")
                            ->andWhere("c.semestre='" . $semestre . "'")
                            ->andWhere("c.semestreAnho='" . $semanho . "'")
                            ->andWhere("c.seccion='" . $seccion . "'")
                            ->andWhere("c.anho='" . $anho . "'")
                            ->andWhere("c.tipo is NULL")
                            ->andWhere("cm.carrera='" . $carrera . "'")
                            ->getQuery()
                            ->execute();
            //X\Msg::Success('Verificar cursos:'.count($cursos)." ".$cursos[0]['idCurso']);return;
            //  X\Msg::Failure('El horario ha sido cargado exitosamente. JO '.count($cursos));return;

            $curso = $this->em->find('Default_Model_Curso', $cursos[0]['idCurso']);
            $categoria = $this->em->find('Default_Model_Categoria', $resp['categoria']);
            $profesor = $this->em->find('Default_Model_Profesor', $resp['profesor']);

            if ($resp['marca'] == 1) {
                $marca = true;
            } else {
                $marca = false;
            }

            $profesorExistente = $this->em->createQueryBuilder()
                            ->select('c.idResponsable')
                            ->from('Default_Model_Responsable', 'c')
                            ->join('c.categoria', 't')
                            ->join('c.profesor', 'p')
                            ->where("c.marca='" . $marca . "'")
                            ->andWhere("t.idCategoria='" . $resp['categoria'] . "'")
                            ->andWhere("p.idProfesor='" . $resp['profesor'] . "'")
                            ->getQuery()
                            ->execute();

            if (count($profesorExistente) > 0) {
                $responsable = $this->em->find('Default_Model_Responsable', $profesorExistente[0]['idResponsable']);
                // X\Msg::Failure('El horario ha sido cargado exitosamente. JOJOJOJOJO1');return;
                $curso->getResponsables()->add($responsable);
                $this->em->persist($curso);
                $c = 0;
            } else {
                $c = 1;
                $responsable = new Default_Model_Responsable();

                $responsable->setCategoria($categoria);
                $responsable->setProfesor($profesor);
                $responsable->setMarca($marca);
                $this->em->persist($responsable);

                $curso->getResponsables()->add($responsable);

                $this->em->persist($curso);
            }
        }
        $this->em->flush();

        X\Msg::Success('El horario ha sido editado exitosamente.');
    }

}

